package edu.shzu.manage.service.impl;

import edu.shzu.manage.dao.MenuDao;
import edu.shzu.manage.entity.Menu;
import edu.shzu.manage.service.MenuServie;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class MenuServiceImpl implements MenuServie {
    @Autowired
    MenuDao menuDao;

    /**
     * 根据ID 查询菜单权限
     * @param menuId
     * @return
     */
    @Override
    public Menu getMenuById(Integer menuId) {
        Menu newMenu;
        List<Menu> menuList = getAllMenu();
        for (Menu menu:menuList) {
            if (menu.getMenuId() == menuId) {
                newMenu = menu;
                return newMenu;
            }
        }
        return menuDao.getMenuById(menuId);
    }

    @Override
    public List<Menu> queryMenu(String str) {
        return menuDao.queryMenu(str);
    }

    /**
     * 查询所有菜单权限
     * @return
     */
    @Override
    public List<Menu> getAllMenu() {
        //查询所有数据
        List<Menu> allList = menuDao.getAllMenu();
        //创建一个List集合 用户存放根节点
        List<Menu> parentList = new ArrayList<>();
        for (Menu menu:allList) {
            //如果pid为-1，则代表为根节点
            if (menu.getPId() == -1) {
                parentList.add(menu);
            }
        }
        //查找根节点下子节点,因为根节点的id就是子节点的pid
        for (Menu menu:parentList) {
            List<Menu> children = getChild(menu.getMenuId(),allList);
            menu.setChildren(children);
        }
        //返回根节点
        return parentList;
    }

    /**
     * 新增菜单权限
     * @param menu
     */
    @Override
    public int insertMenu(Menu menu) {
        return menuDao.insertMenu(menu);
    }

    @Override
    public int updateMenu(Menu menu) {
        return menuDao.updateMenu(menu);
    }

    @Override
    public int deleteMenu(Integer menuId) {
        //首先查出当前节点是否存在子节点，如果存在，则遍历删除子节点
        List<Menu> menuList = menuDao.findByParentId(menuId);
        //递归删除 所有子节点
        if (menuList != null && menuList.size() > 0) {
            for (Menu menu : menuList) {
                deleteMenu(menu.getMenuId());
            }
        }
        //如果没有子节点，则只删除该节点
        return menuDao.deleteMenu(menuId);
    }

    /**
     * 查找子节点
     * @return
     */
    private List<Menu> getChild(Integer id,List<Menu> allList) {
        //存放子节点的集合
        List<Menu> children = new ArrayList<>();
        for(Menu menu:allList) {
            //若根节点id 等于集合内元素的 pid，则说明该元素是根节点的子节点
            //父节点的menuID 等于该节点的pid
            if (menu.getPId() == id) {
                children.add(menu);
            }
        }
        //递归，查看子节点是否存在根节点
        for (Menu menu:children) {
            List<Menu> menuChildren = getChild(menu.getMenuId(),allList);
            menu.setChildren(menuChildren);
        }

        //递归结束条件
        if (children == null) {
            return  null;
        }
        return children;
    }
}
